package br.com.tcc.bean;

import java.util.ArrayList;
import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.model.SelectItem;

import org.apache.log4j.Logger;

import br.com.tcc.dao.AnuncianteDAO;
import br.com.tcc.dao.ProdutoAndAnuncianteDAO;
import br.com.tcc.dao.ProdutoDao;
import br.com.tcc.model.Anunciante;
import br.com.tcc.model.Categoria;
import br.com.tcc.model.Produto;
import br.com.tcc.model.ProdutoAndAnunciante;

@ManagedBean(name = "vitrineBean")
@SessionScoped
public class VitrineBean {
	
	Logger logger = Logger.getLogger(VitrineBean.class);
	
	private List<Produto> listProdutos;
	
	private Anunciante anunciante;
	
	private List<SelectItem> listAnunciantes;
	
	private List<ProdutoAndAnunciante> listProdutoAndAnunciante;

	private ProdutoDao pDAO  =  new ProdutoDao();
	
	private Produto produto;
	
	private String searchInput;
	
	private Categoria categoria;
	
	private int idCategoria;
	
	ProdutoAndAnuncianteDAO pAnuncianteDAO = new ProdutoAndAnuncianteDAO();
	
	public VitrineBean() {
		searchInput = "";
		idCategoria = 0;
		produto = new Produto();
		categoria = new Categoria();
		anunciante = new Anunciante();
		listAnunciantes = null;
	}
	
	public List<Produto> getListProdutos() {
		if (listProdutos == null ) {
			listProdutos = pDAO.listarProdutos();
		}
		return listProdutos;
	}
	
	public String buscarProdutosCategoria() {
		logger.info("***********************************************");
		logger.info("Buscar produtos para o id Categoria [ " +categoria.getIdCategoria() +" ]");
		logger.info("***********************************************");
		logger.info("Anunciante [ " +anunciante.getIdAnunciante() + " ]");
		logger.info("***********************************************");
		setListProdutos(pDAO.buscarProdutosCategoria(categoria, anunciante) );
		
		String retorno = "inicio";
		if (listProdutos.size() == 1) {
			produto = new Produto();
			int id = listProdutos.get(0).getId();
			produto.setId(id);
			retorno = detalhesProduto();
		}
		return retorno;
	}
	
	/**
	 * Iniciar os dados para a tela de inicio
	 * @return
	 */
	public String iniciar() {
		categoria = new Categoria();
		anunciante = new Anunciante();
		setListProdutos(pDAO.listarProdutos());
		listAnunciantes = null;
		return "inicio";
	}
	
	/**
	 * Pesquisar um produto a partir de uma descricao
	 * @return
	 */
	public String pesquisar() {
		//Pesquisar produtos de acordo com oque for informado pelo usuario no campo pesquisar produto
		List<Produto> p;
		logger.info("*********************************");
		logger.info("searchInput[ " +searchInput+ " ] ");
		logger.info("*********************************");
		p = pDAO.pesquisar(searchInput);
		setListProdutos(p);
		
		searchInput = "";
		String retorno = "inicio";
		if (listProdutos.size() == 1) {
			produto = new Produto();
			int id = listProdutos.get(0).getId();
			produto.setId(id);
			retorno = detalhesProduto();
		}
		return retorno;
	} 
	
	public String detalhesProduto() {
		if (produto.getId() != 0) {
			ProdutoAndAnuncianteDAO pAnuncianteDAO = new ProdutoAndAnuncianteDAO();
			ProdutoDao pDAO = new ProdutoDao();
			logger.info("**********************");
			logger.info("ID = "+produto.getId());
			logger.info("**********************");
			listProdutoAndAnunciante = pAnuncianteDAO.listarProdutos(produto.getId());
			produto = pDAO.buscarId(produto.getId());
			return "detalhesProduto";
		}else {
			return "inicio";
		}
	}
	/**
	 * Usado para Consultar produtos para uma categoria / anunciante ou uma categoria e anunciante
	 */
	public String atualizarLista() {
		logger.info("vitrineBean.atualizarLista()");
		logger.info("Id anunciante [ " +anunciante.getIdAnunciante() +" ]" );
		logger.info("Id categoria [ " +categoria.getIdCategoria() +" ]" );
//		if (anunciante.getIdAnunciante() == 0) {
//			setListProdutos(pDAO.listarProdutos());
//		}else {
//			setListProdutos(pDAO.listarProdutosParaAnunciante(anunciante, categoria));
			setListProdutos(pDAO.buscarProdutosCategoria(categoria, anunciante) );
//		}
		
		String retorno = "inicio";
		if (listProdutos.size() == 1) {
			produto = new Produto();
			int id = listProdutos.get(0).getId();
			produto.setId(id);
			retorno = detalhesProduto();
		}
		return retorno;
		
		
	}
	
	public void setListProdutos(List<Produto> listProdutos) {
		this.listProdutos = listProdutos;
	}


	public String getSearchInput() {
		return searchInput;
	}

	public void setSearchInput(String searchInput) {
		this.searchInput = searchInput;
	}

	public List<ProdutoAndAnunciante> getListProdutoAndAnunciante() {
		if (listProdutoAndAnunciante == null) {
			listProdutoAndAnunciante = new ArrayList<ProdutoAndAnunciante>();
		}
		return listProdutoAndAnunciante;
	}

	public void setListProdutoAndAnunciante(List<ProdutoAndAnunciante> listProdutoAndAnunciante) {
		this.listProdutoAndAnunciante = listProdutoAndAnunciante;
	}

	public Produto getProduto() {
		if (produto == null) {
			produto = new Produto();
		}
		return produto;
	}

	public void setProduto(Produto produto) {
		this.produto = produto;
	}

	public Categoria getCategoria() {
		if (categoria == null) {
			categoria = new Categoria();
		}
		return categoria;
	}

	public void setCategoria(Categoria categoria) {
		this.categoria = categoria;
	}

	public int getIdCategoria() {
		return idCategoria;
	}

	public void setIdCategoria(int idCategoria) {
		this.idCategoria = idCategoria;
	}


	public Anunciante getAnunciante() {
		if (anunciante == null) {
			anunciante = new Anunciante();
		}
		return anunciante;
	}

	public void setAnunciante(Anunciante anunciante) {
		this.anunciante = anunciante;
	}

	/**
	 * Preencher a lista com os anunciantes ativos
	 * @return
	 */
	public List<SelectItem> getListAnunciantes() {
		if (listAnunciantes == null) {
			AnuncianteDAO aDAO = new AnuncianteDAO();
			List<Anunciante> listaAnunciantes = aDAO.buscarAnunciantesAtivos();
			listAnunciantes = new ArrayList<SelectItem>();
			for (int i = 0; i < listaAnunciantes.size(); i++) {
				Anunciante a = listaAnunciantes.get(i);
					listAnunciantes.add(new SelectItem(a.getIdAnunciante(), a.getRazaoSocial() + " - " + a.getEndereco().getBairro()));
			}
		}
		return listAnunciantes;
	}

	public void setListAnunciantes(List<SelectItem> listAnunciantes) {
		this.listAnunciantes = listAnunciantes;
	}
}
